這應該是一兩天前的,但因為那幾天忙碌就沒有記下來了。這一題可難可簡單,我是先用了笨方法然後吃到超時,然後請GPT改成快一點的方法(蠻猛的)
這題也是閱讀測驗題,給定list,找出飽含指定索引k的元素的最高分的子陣列
最高分的定義="子序列的長度(len(array))"乘以"子序列的最小元素(min(array))"
這個大概看範例就懂了
我的原始做法是跑一個雙層迴圈,一次向左,一次向右,然後就可以跑完所有的array可能性
‵‵‵
class Solution:
def maximumScore(self, nums: list[int], k: int) -> int:
max_product = -1 # 初始化為-1,因為我們處理的是正整數
n = len(nums)
haha = 0
for start in range(0, k + 1): # start不應超過k
for end in range(k, n): # end至少需要從k開始
sublist = nums[start:end + 1]
current_product = min(sublist) * len(sublist)
max_product = max(max_product, current_product)
print(sublist)
return max_product
但花的時間太多了,可是我又非得把所有的都歷遍過
於是我就叫AI
class Solution:
def maximumScore(self, nums: list[int], k: int) -> int:
max_product = nums[k] # 初始化为 nums[k],因为我们处理的是正整数,nums[k] 是有效子序列的一部分
min_value = nums[k] # 当前的最小值初始化为 nums[k]
left = right = k # 从索引 k 开始向两边扩展
while left > 0 or right < len(nums) - 1: # 当左边或右边有更多元素时继续
# 如果左边没有更多元素,或者右边的元素更大,则向右移动
if left == 0 or (right < len(nums) - 1 and nums[left - 1] < nums[right + 1]):
right += 1
min_value = min(min_value, nums[right])
else: # 否则,向左移动
left -= 1
min_value = min(min_value, nums[left])
current_product = min_value * (right - left + 1) # 计算当前子序列的乘积
max_product = max(max_product, current_product) # 更新最大乘积
return max_product
他用if直接左右擴,然後就過了
我對於記憶體跟時間消耗的部分不是很懂啦
為甚麼這樣比較快呢???